package com.qf.scms.dao;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qf.scms.entity.Course;
import com.qf.scms.entity.SelCourse;
import com.qf.scms.entity.User;
import com.qf.scms.vo.CourseVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * (SelCourse)表数据库访问层
 *
 * @author makejava
 * @since 2025-06-28 09:44:52
 */
public interface SelCourseDao {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    SelCourse queryById(Integer id);

    /**
     * 查询指定行数据
     *
     * @param selCourse 查询条件
     * @param pageable  分页对象
     * @return 对象列表
     */
    List<SelCourse> queryAllByLimit(SelCourse selCourse, @Param("pageable") Pageable pageable);

    /**
     * 统计总行数
     *
     * @param selCourse 查询条件
     * @return 总行数
     */
    Integer count(SelCourse selCourse);

    /**
     * 新增数据
     *
     * @param selCourse 实例对象
     * @return 影响行数
     */
    int insert(SelCourse selCourse);

    /**
     * 批量新增数据（MyBatis原生foreach方法）
     *
     * @param entities List<SelCourse> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<SelCourse> entities);

    /**
     * 批量新增或按主键更新数据（MyBatis原生foreach方法）
     *
     * @param entities List<SelCourse> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常，请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<SelCourse> entities);

    /**
     * 修改数据
     *
     * @param selCourse 实例对象
     * @return 影响行数
     */
    int update(SelCourse selCourse);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Integer id);

    /**
     * 通过课程id查询选课人数
     * @param cid 课程id
     * @return 选课人数
     */
    long queryCourseNum(Integer cid);

    /**
     * 通过课程id查询选课学生id
     * @param cid 课程id
     * @return 选课学生id
     */
    List<Integer> queryStuIdsByCid(String cid);

    /**
     * 通过学生id查询选课课程id
     * @param page 分页参数
     * @param stuIds 学生id列表
     * @return 分页结果
     */
    IPage<User> queryStudentsByStuIds(Page<User> page, @Param("stuIds") List<Integer> stuIds);


    /**
     * 根据学生的学号和课程id删除选课记录
     * @param sid 学生学号
     * @param cid 课程编号
     * @return 删除受影响的行数
     */
    int deleteSelCourseRecordBySid(@Param("sid") String sid, @Param("cid") String cid);

    /**
     * 根据学生的学号和课程id查询选课记录
     * @param sid 学生学号
     * @param cid 课程编号
     * @return 是否已选课
     */
    Integer queryBySidAndCid(@Param("sid") String sid, @Param("cid") String cid);

    /**
     * 统计选课人数
     * @param cid 课程编号
     * @return 选课人数
     */
    Integer countCourseNumByCid(@Param("cid") String cid);

    /**
     * 查询当前学生的选课记录
     * @param page 分页参数
     * @param sid 学生学号
     * @return 选课记录
     */
    IPage<CourseVO> queryStuSelCourseByPage(Page<Course> page, @Param("sid") String sid);
}

